Linux文字處理工具中, 有另一個殺器awk
但awk是個程式語言
, 所以它很靈活且功能強大.
awk可以幫助我們統計
,可以製作表格
等等的格式化以後, 做顯示, 算是個報告生成器
## awk處理方式
一行
內容, 跟下一節的sed
一樣都是行處理工具切片
處理, 對單字做切片// 輸出第一個單字
awk '{print $1}'
// 命令行格式
awk [options] 'command' file(s)
// awk程式區塊格式
awk -f awk-script-file file(s)
// 管道格式
stdout | awk [options] 'command'
stdout | awk -f awk-script-file
awk [options] 'command' file(s)
這裡command
也有自己的格式pattern {awk操作命令}
pattern這裡可以是Regex也可以是邏輯判斷式, 是不是很強大?
awk -F ':' '{print $1}' /etc/passwd
把/etc/passwd給輸出出來, 如下圖
透過awk取得用戶名稱, 用戶名稱依照:
做分割的話, 會是第一個字段
透過awk把第1個字段和第3個字段UID一起輸出, 透過,
在變數之間多個空格, 是awk預設的分隔符號.
如果是這樣打'{print $1 $3}'
, 對awk來說是把字串做拼接, 並不會把字串做分隔.
又或是透過" "
把空格視為字串一起輸出; 也能透過這種方式, 補充些說明文字
awk -F ':' '{print $1,$3}' /etc/passwd
awk -F ':' '{print "User:"$1" ""UID:"$3}' /etc/passwd
// 輸出行號與每行的字段總數量
awk -F ':' '{print NR,NF}' /etc/passwd
透過剛剛學的, 將/etc/passwd中的用戶名稱, 行號跟字段數量給輸出
awk -F ':' '{print "Ln:"NR,"WordCnt:"NF,"User:"$1}' /etc/passwd
也能透過printf
做格式化字串
awk -F ':' '{printf "Ln:%2s WordCnt:%s User:%s\n", NR,NF,$1}' /etc/passwd
// 需要加上\n, 替每一行的輸出做換行
只輸出UID > 10的行號、用戶名
awk -F ':' '{if ($3>100) printf "Ln:%2s User:%s\n", NR, $1}' /etc/passwd
找出/var/log/syslog中發生Error的日期時間
可以透過之前的grep來查找後, 在用awk只輸出日期時間
grep "Error" syslog | awk '{print $1, $2, $3}'
也能在awk中使用Regex
awk '/Error/{print $1,$2,$3}' syslog
awk關鍵字不多, 可以在整理輸出時, 用一些控制命列+邏輯運算做些過濾, 而後將結果整齊的輸出
是個簡單的語言也是個強大的工具